//package com.example.runable;
//
//import com.alibaba.excel.EasyExcel;
//import com.alibaba.excel.ExcelWriter;
//import com.alibaba.excel.metadata.CellData;
//import com.alibaba.excel.metadata.Head;
//import com.alibaba.excel.write.metadata.WriteSheet;
//import com.alibaba.excel.write.metadata.WriteTable;
//import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
//import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
//import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
//import com.example.constant.CommonConstant;
//import com.example.handler.excelhander.AbstractCellWriteHandler;
//import com.example.handler.excelhander.CustomCellWriteHandler;
//import com.example.handler.excelhander.MergeStrategy;
//import com.example.mapper.CommonMapper;
//import com.example.vo.IdxInfoVO;
//import com.example.vo.TableDDLVO;
//import com.example.vo.TableInfoVO;
//import com.example.vo.TableVO;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.poi.ss.usermodel.Cell;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.context.annotation.Configuration;
//
//import java.io.FileOutputStream;
//import java.io.OutputStream;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//@Configuration
//@Slf4j
//public class ExcelExportRunner implements ApplicationRunner {
//
//    @Autowired
//    CommonMapper commonMapper;
//
//    @Override
//    public void run(ApplicationArguments args) throws Exception {
//
//        List<TableVO> tableNameList = commonMapper.queryTableNameList();
//
//        ExcelWriter excelWriter = null;
//        try {
//            excelWriter = EasyExcel.write(new FileOutputStream(CommonConstant.path)).build();
//
//            WriteSheet tableNameSheet = EasyExcel.writerSheet(0,CommonConstant.firstName)
//                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
//                    .registerWriteHandler(new AbstractCellWriteHandler() {})
//                    .build();
//            WriteTable tableNameTable = EasyExcel.writerTable(0).head(TableVO.class).needHead(true).build();
//            excelWriter.write(tableNameList, tableNameSheet, tableNameTable);
//
//
//            for (int i = 0; i < tableNameList.size(); i++) {
//
//                TableVO tableVO=tableNameList.get(i);
//                String tableName=tableVO.getTableName();
//                List<TableInfoVO> tableInfoVOList = commonMapper.getTableInfo(tableName);
//                List<IdxInfoVO> idxInfoVOList = commonMapper.getIdxInfo(tableName);
//                List<TableDDLVO> ddlvoList = commonMapper.getDDL(tableName);
//                int size = tableInfoVOList.size();
//                int size1 = idxInfoVOList.size();
//
//                WriteSheet tableInfoSheet = EasyExcel.writerSheet(i+1,tableName)
//                        .registerWriteHandler(new MergeStrategy(size,size1))
//                        .registerWriteHandler(new AbstractColumnWidthStyleStrategy(){
//                            private static final int MAX_COLUMN_WIDTH = 256;
//
//                            private final Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<Integer, Map<Integer, Integer>>(8);
//                            @Override
//                            protected void setColumnWidth(WriteSheetHolder writeSheetHolder, CellData cellData, Cell cell, Head head, int relativeRowIndex, boolean isHead) {
//                                try {
//                                    if (!isHead && cellData == null) {
//                                        return;
//                                    }
//                                    Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
//                                    if (maxColumnWidthMap == null) {
//                                        maxColumnWidthMap = new HashMap<Integer, Integer>(16);
//                                        CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
//                                    }
//                                    Integer columnWidth = dataLength(cellData, cell, isHead);
//                                    if (columnWidth < 0) {
//                                        return;
//                                    }
//                                    if (columnWidth > MAX_COLUMN_WIDTH) {
//                                        columnWidth = MAX_COLUMN_WIDTH;
//                                    }
//                                    if (head!=null){
//                                        Integer maxColumnWidth = maxColumnWidthMap.get(head.getColumnIndex());
//                                        if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
//                                            maxColumnWidthMap.put(head.getColumnIndex(), columnWidth);
//                                            if(columnWidth<255){
//                                                writeSheetHolder.getSheet().setColumnWidth(head.getColumnIndex(), columnWidth * 256);
//                                            }
//                                        }
//                                    }
//                                }catch (Exception e){
//                                    log.info("错误");
//                                    log.info("==========",e);
//                                }
//                            }
//
//                            private Integer dataLength(CellData cellData, Cell cell, boolean isHead) {
//                                if (isHead) {
//                                    return cell.getStringCellValue().getBytes().length;
//                                }
//                                switch (cellData.getType()) {
//                                    case STRING:
//                                        return cellData.getStringValue().getBytes().length;
//                                    case BOOLEAN:
//                                        return cellData.getBooleanValue().toString().getBytes().length;
//                                    case NUMBER:
//                                        return cellData.getNumberValue().toString().getBytes().length;
//                                    default:
//                                        return -1;
//                                }
//                            }
//                        })
//                        .registerWriteHandler(new CustomCellWriteHandler())
//                        .build();
//
//                WriteTable colTable = EasyExcel.writerTable(0).head(TableInfoVO.class).needHead(true).build();
//                WriteTable idxTable = EasyExcel.writerTable(1).head(IdxInfoVO.class).needHead(true).build();
//                WriteTable ddlTable = EasyExcel.writerTable(2).head(TableDDLVO.class).needHead(true).build();
//                excelWriter.write(dataList(tableVO),tableInfoSheet);
//                excelWriter.write(tableInfoVOList, tableInfoSheet, colTable);
//                excelWriter.write(idxInfoVOList, tableInfoSheet, idxTable);
//                excelWriter.write(ddlvoList, tableInfoSheet, ddlTable);
//
//            }
//
//        }catch(Exception e){
//            log.info("==================aaaaaaa",e);
//            throw e;
//        }finally {
//            if (excelWriter!=null){
//                excelWriter.finish();
//            }
//        }
//
//    }
//
//    private List<List<String>> getHead(TableVO tableVO) {
//        List<List<String>> list = new ArrayList<List<String>>();
//        List<String> head0 = new ArrayList<String>();
//        head0.add("表名/描述");
//        List<String> head1 = new ArrayList<String>();
//        head1.add(tableVO.getTableName());
//        List<String> head2 = new ArrayList<String>();
//        head2.add(tableVO.getComments());
//        List<String> head3 = new ArrayList<String>();
//        head2.add(CommonConstant.returnStr);
//        list.add(head0);
//        list.add(head1);
//        list.add(head2);
//        list.add(head3);
//        return list;
//    }
//
//    private List<List<String>> dataList(TableVO tableVO) {
//        List<List<String>> list = new ArrayList<>();
//        List<String> data = new ArrayList<>();
//        data.add("表名/描述");
//        data.add(tableVO.getTableName());
//        data.add("");
//        data.add(tableVO.getComments());
//        data.add("");
//        data.add(CommonConstant.returnStr);
//        list.add(data);
//        return list;
//    }
//}
